﻿#include "commonpage.h"
#include "ui_commonpage.h"
#include "listitembox.h"

#include <QDebug>

CommonPage::CommonPage(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::CommonPage)
{
    ui->setupUi(this);

//    移除掉QListWidget的水平滚动条
    ui->pageMusicList->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);


    connect(ui->playAllBtn, &QPushButton::clicked, this, [=](){
        // 点击播放所有按钮后, 通知QQMusic 播放当前页面的所有歌曲
//        emit playAll(this->pageType);
          emit playAll(this);
    });

    // 双击item项后,触发信号调用槽函数,槽函数发射该信号通知QQMusic,播放该位置的音乐
    // void doubleClicked(const QModelIndex &index);
    connect(ui->pageMusicList, &QListWidget::doubleClicked, this, [=](const QModelIndex &index){
        emit playMusicByIndex(this, index.row());
    });
}

CommonPage::~CommonPage()
{
    delete ui;
}

void CommonPage::setCommonPageUI(const QString &title, const QString &image)
{
    // 设置标题
    ui->pageTittle->setText(title);

    // 设置封面栏
    ui->musicImageLabel->setPixmap(QPixmap(image));
    ui->musicImageLabel->setScaledContents(true);// 用于控制控件是否自动缩放其内容以适应控件尺寸

//    // 向QListWidegt控件里面添加 QListWidgetItem类元素


//    // 通过下面这个函数函数 添加元素操作
//    // 对下面函数解释: setItemWidget() 允许在 QListWidget 的指定项（item）上挂载一个自定义控件（widget），实现复杂列表项的显示。
//    // item: 目标列表项    widget: 要嵌入的自定义控件
//    // void QListWidget::setItemWidget(QListWidgetItem *item, QWidget *widget)

//    QListWidgetItem *item = new QListWidgetItem(ui->pageMusicList);
//    ListItemBox *listItemBox = new ListItemBox(this);
//    //然后item对象,有默认大小,所以需要设置指定大小
//    item->setSizeHint(QSize(ui->pageMusicList->width(), 45));
//    ui->pageMusicList->setItemWidget(item, listItemBox);
}

void CommonPage::setMusicListType(PageType pageType)
{
    this->pageType = pageType;
}

void CommonPage::addMusicToPage(MusicList &musicList)
{
    // 每一次的添加都要将该页面 QVector<QString> musicListOfPage 中元素清除,否则musicListOfPage 中有重复元素
    musicListOfPage.clear();
    // 注意:这里的清除并没有影响界面的显示(需要对该部分进行处理)

    for(auto &music : musicList)
    {
        switch(pageType)
        {
        case PageType::LIKE_PAGE:
            if(music.getIsLike())
            {
                musicListOfPage.push_back(music.getMusicId());
            }
            break;
        case PageType::LOCAL_PAGE:
            musicListOfPage.push_back(music.getMusicId());
            break;
        case PageType::HISTORY_PAGR:
            if(music.getIsHistory())
            {
               musicListOfPage.push_back(music.getMusicId());
            }
            break;
        default:
            qDebug() << "暂时未设置其他类型";
        }
    }
}

void CommonPage::reFresh(MusicList &musicList)
{
    // 当重新显示界面元素时, 要将上一次的元素释放掉,否则会出现重复
    ui->pageMusicList->clear(); // 会将 QListWidget 下的所有子空间所有释放

    // 将属于该当前页面的音乐 添加到该成员里 musicListOfPage,进行管理
    addMusicToPage(musicList);

    for(auto musicId : musicListOfPage)
    {
        auto it = musicList.findMusicById(musicId);
        if(it == musicList.end())
            continue;

        // 向QListWidegt控件里面添加 QListWidgetItem类元素

        // 通过下面这个函数函数 添加元素操作
        // 对下面函数解释: setItemWidget() 允许在 QListWidget 的指定项（item）上挂载一个自定义控件（widget），实现复杂列表项的显示。
        // item: 目标列表项    widget: 要嵌入的自定义控件
        // void QListWidget::setItemWidget(QListWidgetItem *item, QWidget *widget)

        QListWidgetItem *item = new QListWidgetItem(ui->pageMusicList);
        ListItemBox *listItemBox = new ListItemBox(this);
        // 设置歌曲的名称,歌手,专辑到 listItemBox 进行界面更新
        listItemBox->setMusicName(it->getMusicName());
        listItemBox->setSinger(it->getSingerName());
        listItemBox->setAlbumName(it->getAlbumName());
        listItemBox->setLikeIcon(it->getIsLike());

        //然后item对象,有默认大小,所以需要设置指定大小
        item->setSizeHint(QSize(ui->pageMusicList->width(), 47));
        ui->pageMusicList->setItemWidget(item, listItemBox);

        // 接受listItemBox发射的setLikeMusic信号
        connect(listItemBox, &ListItemBox::setLikeMusic, this, [=](bool isLike){
            // 更新music的 我喜欢 属性
            // 通知qqmusic, 让其中的 likePage, loaclPage, recentPage 更新页面歌曲的属性
            emit updateLikeMusic(isLike, it->getMusicId());
            // 其实根本是由qqMusic类来操作的, 因为qqMusic不知道更新哪些信息, 通过 listitemBox的父类commonpage来通知qqmusic
        });
    }

    // 触发窗口重绘paintEvent
    // repaint()会立即执行paintEvent()，不会等待事件队列的处理
    // update（）将一个paintEvent事件添加到事件队列中，等待稍后执行，即不会立即执行 paintEvent。
    repaint();
}

// 将对应页面的音乐添加到 音乐播放列表里面
void CommonPage::addMusicToplayList(MusicList &musicList, QMediaPlaylist* playList)
{
    for(auto music : musicList)
    {
        switch(pageType)
        {
        case LIKE_PAGE:
            if(music.getIsLike())
            {
                playList->addMedia(music.getMusicUrl());
            }
            break;
        case LOCAL_PAGE:
            playList->addMedia(music.getMusicUrl());
            break;
        case HISTORY_PAGR:
            if(music.getIsHistory())
            {
                playList->addMedia(music.getMusicUrl());
            }
            break;
        default:
            qDebug() << "其他类型页面";
            break;
        }
    }
}

QString CommonPage::getMusicIdByIndex(int index)
{
    if(index >= musicListOfPage.size())
    {
        qDebug() << "无此歌曲";
        return "";
    }
    return musicListOfPage[index];
}

void CommonPage::setMusicImage(QPixmap pixmap)
{
    ui->musicImageLabel->setPixmap(pixmap);
    ui->musicImageLabel->setScaledContents(true);
}
